package main

import (
	"context"
	"fmt"
	"github.com/gin-gonic/gin"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"os/signal"
	"time"
	"ztool/common"
	"ztool/dao"
	"ztool/routers"
	"ztool/task"
)

func main() {

	logoStr, _ := ioutil.ReadFile("banner.txt")

	if nil != logoStr {
		fmt.Println(string(logoStr))
	}

	//加载配置文件
	initConfig()

	//定义一个雪花id全局
	common.InitSnowflakeId(1)

	//初始化数据库
	initDatabase()

	//定时任务
	task.ClearExpriseDateTask()

	//初始化web服务
	initWebServer()
}

//初始化配置文件
func initConfig() {
	log.Println("正在加载配置文件...")
	err := common.LoadConfig("config.yml")
	if err != nil {
		log.Fatal("配置文件读取失败，无法启动")
		return
	}
}

// 初始化数据集
func initDatabase() {
	//初始化数据库
	log.Println("开始加载数据库...")
	common.InitDB()
	//自动迁移保证表结构
	common.GetDB().AutoMigrate(&dao.Users{}, &dao.Blacklist{},
		&dao.SDKUsers{}, &dao.VideoDevice{}, &dao.Tag{}, &dao.VideoTags{})
	dao.CreateDefaultUser()
}

// 初始化web服务
func initWebServer() {
	//是否debug模式
	isDebug := common.GetServerConfig().Debug

	var closeTimeOut time.Duration = 0

	if !isDebug {
		//releas模式
		gin.SetMode(gin.ReleaseMode)
		closeTimeOut = 5 * time.Second
	}

	//获取端口
	serverPort := common.GetServerConfig().Port
	log.Printf("启动ZTool服务... 端口：%d", serverPort)
	r := routers.SetupRouter()

	// 这样写就可以了，下面所有代码（go1.8+）是为了优雅处理重启等动作。
	srv := &http.Server{
		Addr:         fmt.Sprintf(":%d", serverPort),
		Handler:      r,
		ReadTimeout:  30 * time.Second,
		WriteTimeout: 30 * time.Second,
	}

	go func() {
		// 监听请求
		if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("服务启动失败: %s\n", err)
		}
	}()

	// 优雅Shutdown（或重启）服务
	quit := make(chan os.Signal)
	signal.Notify(quit, os.Interrupt) // syscall.SIGKILL
	<-quit
	log.Println("关闭服务 ...")
	ctx, cancel := context.WithTimeout(context.Background(), closeTimeOut)
	defer cancel()
	if err := srv.Shutdown(ctx); err != nil {
		log.Fatal("关闭服务错误:", err)
	}
	select {
	case <-ctx.Done():
	}
	log.Println("退出服务")
}
